package es.udc.acs.udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.SocketTimeoutException;

public class ClienteUDP {
	
	private ClienteUDP(){}
	
	public static String sendMessage(String server, 
									 int port, 
									 String message, 
									 int seg) throws SocketTimeoutException {
		String response = null ;
		
		try {
			InetAddress dirServidor = InetAddress.getByName(server);

            //Creamos el socket no orientado a conexion (en cualquier puerto)
            DatagramSocket sDatagram = new DatagramSocket();

            //Establecemos un timeout de seg
            sDatagram.setSoTimeout(seg*1000);

            //Preparamos el datagrama que vamos a enviar y lo enviamos
            DatagramPacket dgramEnv = new DatagramPacket (message.getBytes(),
                    message.length(), dirServidor,port);
            sDatagram.send(dgramEnv);
            /*
            System.out.println("Enviando "
                    + new String(dgramEnv.getData()) + " a "
                    + dgramEnv.getAddress().toString() + ":"
                    + dgramEnv.getPort());*/            
            
            //Preparamos el datagrama de recepción
            byte array[] = new byte[1024];
            DatagramPacket dgramRec = 
            		new DatagramPacket(array, array.length);
            sDatagram.receive(dgramRec);
            
            /*System.out.println("Recibiendo "
                    + new String(dgramRec.getData(), 0, dgramRec.getLength())
                    + " de " + dgramRec.getAddress().toString() + ":"
                    + dgramRec.getPort());*/
            
            //Cerramos el socket para liberar la conexión
            sDatagram.close();
            
            response = new String(dgramRec.getData(), 0, dgramRec.getLength());

        } catch (SocketTimeoutException e) {
            throw new SocketTimeoutException();
        } catch (SocketException e) {
            System.err.println("Error: " + e.getMessage());
        } catch (IOException e) {
            System.err.println("Error: " + e.getMessage());
        }
        return response;
    }
}
